package pl.BasicLexer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;


public class Procesador {
	
	public Procesador() {	
	}

	public int fichero(String nombreFicheroEntrada) {
        int resultado = -1;
		try {
			CharStream cs = new ANTLRFileStream(nombreFicheroEntrada);
			BasicLexer lexer = new BasicLexer(cs);
			CommonTokenStream tokens = new CommonTokenStream();
			tokens.setTokenSource(lexer);
			BasicParser parser = new BasicParser(tokens);
			parser.entrada();
		    if ((!lexer.hasErrors()) && (!parser.hasErrors())) {
		        System.out.print("\nAnalisis sintactico correcto...");
		        resultado = 0;
		    }
		    else {
		        System.out.print("\nAnalisis sintactico incorrecto...");
		        resultado = 1;
		    }
		} catch (IOException ioe) {
		    System.out.print("Error fichero de entrada no encontrado: " + nombreFicheroEntrada);
			resultado = 2;
		} catch (RecognitionException re) {
		}
		return resultado;
	}

    public int linea() {
        int resultado = -1;
        try {
            System.out.print("Introduzca la linea para el analisis sintactico (ENTER + Ctrl+Z -> fin de entrada): ");
            ANTLRInputStream ais = new ANTLRInputStream(System.in);
            BasicLexer lexer = new BasicLexer(ais);
            CommonTokenStream tokens = new CommonTokenStream();
            tokens.setTokenSource(lexer);
            BasicParser parser = new BasicParser(tokens);
            parser.instruccion();
            if ((!lexer.hasErrors()) && (!parser.hasErrors())) {
                System.out.print("\nAnalisis sintactico correcto...");
                resultado = 0;
            }
            else {
                System.out.print("\nAnalisis sintactico incorrecto...");
                resultado = 1;
            }
        } catch (IOException ioe) {
            System.out.print("Error en el flujo de entrada: System.in");
            resultado = 2;
        } catch (RecognitionException re) {
        }
        return resultado;
    }

    public int string() {
        int resultado = -1;
        try {
            System.out.print("Introduzca la linea para el analisis sintactico (ENTER -> fin de entrada): ");
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            String lineaAnalizar = br.readLine();
            CharStream cs = new ANTLRStringStream(lineaAnalizar);
            BasicLexer lexer = new BasicLexer(cs);
            CommonTokenStream tokens = new CommonTokenStream();
            tokens.setTokenSource(lexer);
            BasicParser parser = new BasicParser(tokens);
            parser.instruccion();
            if ((!lexer.hasErrors()) && (!parser.hasErrors())) {
                System.out.print("\nAnalisis sintactico correcto...");
                resultado = 0;
            }
            else {
                System.out.print("\nAnalisis sintactico incorrecto...");
                resultado = 1;
            }
        } catch (IOException ioe) {
            System.out.print("Error en el flujo de entrada: System.in");
            resultado = 2;
        } catch (RecognitionException re) {
        }
        return resultado;
    }

	public void lineaAlinea() {
		try {
		    System.out.print("Introduzca una linea o \"fin\" para terminar con el analisis sintactico: ");
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            ANTLRStringStream ass = null;
			BasicLexer lexer = null;
			BasicParser parser = null;
			for (String linea = br.readLine(); !linea.equals("fin"); linea = br.readLine()) {
			    ass = new ANTLRStringStream(linea);
				lexer = new BasicLexer(ass);
				CommonTokenStream tokens = new CommonTokenStream();
				tokens.setTokenSource(lexer);
				parser = new BasicParser(tokens);
				parser.instruccion();
	            if ((!lexer.hasErrors()) && (!parser.hasErrors())) {
	                System.out.println("\nAnalisis sintactico correcto...\n");
	            }
	            else {
	                System.out.println("\nAnalisis sintactico incorrecto...\n");
	                lexer.errors.clear();
	                parser.errors.clear();
	            }
	            System.out.print("Introduzca una linea o \"fin\" para terminar con el analisis sintactico: ");
			}
		} catch (IOException ioe) {
		    System.out.print("Error en el flujo de entrada: System.in");
		} catch (RecognitionException re) {
		}
	}


}
